<?php

/**
 * clase JL Tool
 */
class JLTools {

    private static $_instance;

    /**
     * @return JLTools
     */
    public static function getInstance() {
        if (self::$_instance == null) {
            self::$_instance = new self();
        }

        return self::$_instance;
    }

    /**
     * Retorna un mensaje en simple html
     * @params $string [String] = Mensaje
     * @params $type [String] = Tipo de mensaje, Valores = default, alert, info
     * @return [String]
     */
    public function simple_message($string, $type = 'default') {
        $type = strtolower($type);
        $string = utf8_encode($string);
        switch ($type) {
            case "alert":
                $msg = '<div class="ui-widget">
    <div class="ui-state-error ui-corner-all" style="padding: 0 .7em;"> 
        <p><span class="ui-icon ui-icon-alert" style="float: left; margin-right: .3em;"></span> 
        <strong>Alerta: </strong>' . $string . '</p>
    </div>
</div>
';
                break;

            case "info":
                $msg = '<div class="ui-widget">
			<div class="ui-state-highlight ui-corner-all" style="padding: 0 .7em;"> 
				<p><span class="ui-icon ui-icon-info" style="float: left; margin-right: .3em;"></span>
				<strong>Informaci&oacute;n: </strong>' . $string . '</p>
		  </div>
		</div>';
                break;

            default :
                $msg = '<div class="ui-state-default ui-corner-all" style="padding: 0 .7em;"> 
				<p><span class="ui-icon ui-icon-alert" style="float: left; margin-right: .3em;"></span> 
				' . $string . '</p>
			</div>';
                break;
        }

        return $msg;
    }

    /**
     * Evita Injeccion Sql
     * @Params $value[String] variable ha utilizar
     * @Return String
     */
    public function sql_quote($value, $cnn) {
        if (get_magic_quotes_gpc())
            $value = stripslashes($value);

        // Check if this function exists
        if (function_exists("mysql_real_escape_string")) {
            $value = mysql_real_escape_string($value, $cnn);
        } else {
            // For PHP version <4.3.0 use addslashes
            $value = addslashes($value);
        }

        return $value;
    }

    /**
     * Acorta un estring de acuerdo a la logitud de caracteres
     * @Params $value[String] variable ha utilizar, $len[Int] longitud de caracteres
     * @Return String
     */
    public function short_string($string, $len = 30, $tag = "...") {
        if (strlen($string) > $len) {
            $string = substr($string, 0, $len) . $tag;
        }

        return $string;
    }

    /**
     * Genera letras o numeros aleatorios de acuerdo a longitud de caracteres
     * @param 
     * $length [int] longitud de clave. 
     * $type [String] 'numeros',letras',ambos' 
     * @return [string]
     */
    public function RandomNumerosLetras($length, $type = "numeros") {
        switch (strtolower($type)) {
            case "ambos":
                $pattern = "1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ";
                $pattern .= "1234567890klmnopqrstuvwxyz";
                break;

            case "letras":
                $pattern = "ABCDEFGHIJKLMNOPQRSTUVWXYZABCEFGHIJK";
                $pattern .= "abcdefghijklmnopqrstuvwxyz";
                break;

            case "numeros":
                $pattern = "1234567890";
                $pattern .= "12345678901234567890123456789012345678901234567890012";
                break;
        };

        $key = $pattern{ rand(0, 61) };
        for ($i = 1; $i < $length; $i++) {
            $key .= $pattern{rand(0, 61)};
        }

        return $key;
    }

    function createKey($amount) {
        $keyset = "abcdefghijklmABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
        $randkey = "";
        for ($i = 0; $i < $amount; $i++)
            $randkey .= substr($keyset, rand(0, count($keyset) - 1), 1);

        return $randkey;
    }

    /**
     * Retorna la ruta base( nombre de servidor y directorio base) del archivo, especificando como parametro $_SERVER['PHP_SELF']
     * @param $path [String] = $_SERVER['PHP_SELF'] ruta del archivo.
     * @return [string]
     */
    public function pathBase($path = "") {
        if (empty($path))
            $path = $_SERVER['PHP_SELF'];

        $url = isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on' ? 'https://' : 'http://';

        // Complete the URL
        $url .= $_SERVER['HTTP_HOST'] . dirname($path);

        // echo the URL
        return $url;
    }

    /**
     * JLTools::getNameDomain()
     * Retorna el nombre de dominio de servidor actual.
     * @return string
     */
    function getNameDomain() {
        $url = isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on' ? 'https://' : 'http://';
        // Complete the URL
        $url .= $_SERVER['HTTP_HOST'];
        return $url;
    }

    /**
     * Retorna el nombre del directorio actual
     * @param no
     * @return [string]
     */
    public function my_dirname() {
        return end(explode('/', dirname(!empty($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : !empty($_SERVER['PHP_SELF']) ? $_SERVER['PHP_SELF'] : str_replace('\\', '/', __FILE__))));
    }

    /**
     * Convierte una Fecha a Formato Normal ej.'25/12/2008' o a Formato de Mysql ej.'2008-12-25'
     * @param $fecha [String] Fecha Normal ej.'25/12/2008' o Mysql ej.'2008-12-25'
     * @param $conversion [String] Tipo de converion de Fecha: valores ['amysql'] ['anormal']
     * @return [string]
     */
    public function CambiarFormatoFecha($fecha, $conversion = "amysql") {
        $mifecha = '';
        switch ($conversion) {
            case "amysql":
                preg_match("/([0-9]{1,2})/([0-9]{1,2})/([0-9]{2,4})/", $fecha, $mifecha);
                $lafecha = $mifecha[3] . "-" . $mifecha[2] . "-" . $mifecha[1];
                break;

            case "anormal":
                preg_match("/([0-9]{2,4})-([0-9]{1,2})-([0-9]{1,2})/", $fecha, $mifecha);
                $lafecha = $mifecha[3] . "/" . $mifecha[2] . "/" . $mifecha[1];
                break;
        }

        return $lafecha;
    }

    /**
     * Retorna la Fecha y Hora Actual del sistema la fecha Formato de Mysql ej.'2008-12-25'
     * @param $retornar [String] Especifica los datos retornados: 'fecha', 'hora' o 'ambos'
     * @param $conversion_fecha [String] Tipo de converion de Fecha: valores ['amysql'] ['anormal']
     * @param $tag [bool] especiofica si se agrega tag (am o pm). valores ['true'] ['false']
     * @return [string]
     */
    public function FechaActual($retornar, $conversion_fecha = "amysql", $tag = false) {
        $fecha = date("Y-m-d");
        $hora = (intval(date("g")) - 1) . date(":i:s");

        if ($tag)
            $tag = date("a");

        switch ($retornar) {
            case "fecha":
                $return = $this->CambiarFormatoFecha($fecha, $conversion_fecha);
                break;

            case "hora":
                $return = $hora . " " . $tag;
                break;

            case "ambos":
                $return = $this->CambiarFormatoFecha($fecha, $conversion_fecha) . " " . $hora . " " . $tag;
                break;
        }

        return $return;
    }

    /**
     * Funcion que Evalua la Extension de un Archivo.
     * @param $archivo[String] 
     * @param $extension[String]
     * @return Devuelve 1 si es Verdadero y 0 si es Falso;
     * */
    public function evaluaExtension($archivo, $extension) {
        // Devuelve 1 si es Verdadero y 0 si es Falso
        $len_file = strlen($archivo);
        $len_ext = strlen($extension);
        $ext = substr($archivo, $len_file - $len_ext, $len_file);

        if (strtolower($extension) == strtolower($ext)) {
            $ok = 1;
        } else {
            $ok = 0;
        }
        return $ok;
    }

    /**
     * JLTools::getFileExtension()
     * Retorna la extension de un archivo.
     * @param string $fileNamePath
     * @return string
     */
    function getFileExtension($fileNamePath) {
        return strtolower(substr(strrchr($fileNamePath, '.'), 1));
    }

    /**
     * Elimina un Directorio y su contenido.
     * @Parametros [$dir_path] -> directorio a eliminar.
     * @Tipo [Funcción]
     * @Retorna [bool] -> true si se eliminó correctamente y false si no se eliminó.
     * */
    public function DeleteDirectory($dir_path) {
        if ($this->DeleteChildDirectory($dir_path)) {
            if (!rmdir($dir_path))
                return false;
        }
        else {
            return false;
        }

        return true;
    }

    /**
     * Elimina los subdirectorios del Directorio principal.
     * @Parametros [$dir_path] -> directorio a eliminar.
     * @Tipo [Funcción]
     * @Retorna [bool] -> true si se eliminó correctamente y false si no se eliminó.
     * */
    public function DeleteChildDirectory($dir_path) {
        if (is_dir($dir_path) && file_exists($dir_path)) {
            $handle = opendir($dir_path);

            while ($file = readdir($handle)) {
                $fullpath = $dir_path . "/" . $file;

                if (is_file($fullpath)) {
                    @unlink($fullpath);
                } else if (is_dir($fullpath) && $file != "." && $file != "..") {
                    $this->DeleteChildDirectory($fullpath);
                    if (!rmdir($fullpath))
                        return false;
                }
            }

            closedir($handle);
        }
        else {
            return false;
        }

        return true;
    }

    /**
     * JLTools::MakeDir()
     * Crea un directorio especificado.
     * @param string $path
     * @param int $path
     * @return bool
     */
    function MakeDir($path, $mode = 0755) {
        return @mkdir($path, $mode);
    }

    /**
     * Calcula porcentaje de un número.
     * @Parametros 
     * [$cantidad] 	-> Número a calcular.
     * [$porcierto] 	-> Porcentaje a calcular.
     * [$decimales] 	-> Número de decimales.
     * @Tipo [Funcción]
     * @Retorna [decimal]
     * */
    public function porcentaje($cantidad, $porciento, $decimales = 2) {
        $res = number_format(($cantidad * $porciento) / 100, $decimales);
        return $res;
    }

    /**
     * Retorna el idioma y el pais del usuario en codigo ISO 3166 en abreviatura de dos Digitos. ejm: [es] [pe]
     * @Parametros Ninguno
     * @Tipo [Funcción]
     * @Retorna [Array]
     * */
    function detectarIdiomaPais() {
        //revisamos cabecera HTTP_ACCEPT_LANGUAGE 
        $idiomas = explode("-", strtolower(trim($_SERVER['HTTP_ACCEPT_LANGUAGE'])));
        $idioma = $idiomas[0];
        $pais = $idiomas[1];
        $datos = array("idioma" => $idioma, "pais" => $pais);

        return $datos;
    }

    public function dataGridJSON($cnn, $SQL, $campoId, $utf8 = true) {
        $db = $cnn;

        include_once "JSON.class.php";
        $json = new Services_JSON();

        $page = $_REQUEST['page'];
        $limit = (isset($_REQUEST['rows']) && !empty($_REQUEST['rows'])) ? $_REQUEST['rows'] : 0;
        $sidx = $_REQUEST['sidx'];
        $sidx = is_array($sidx) ? $sidx[0] : $sidx;
        $sord = $_REQUEST['sord'];

        if (!$sidx)
            $sidx = 1;
        if (isset($_REQUEST['_search']) && !empty($_REQUEST['_search']))
            $searchOn = $this->strip($_REQUEST['_search']);
        if (isset($_REQUEST['searchField']) && !empty($_REQUEST['searchField']) && $searchOn == 'true') {
            $fld = $this->strip($_REQUEST['searchField']);
            $wh .= " WHERE " . $fld;
            $fldata = $this->strip($_REQUEST['searchString']);
            $foper = $this->strip($_REQUEST['searchOper']);

            switch ($foper) {
                case "bw":
                    $fldata .= "%";
                    $wh .= " LIKE '" . $fldata . "'";
                    break;
                case "eq":
                    $wh .= (is_numeric($fldata)) ? " = " . $fldata : " = '" . $fldata . "'";
                    break;
                case "ne":
                    $wh .= (is_numeric($fldata)) ? " <> " . $fldata : " <> '" . $fldata . "'";
                    break;
                case "lt":
                    $wh .= (is_numeric($fldata)) ? " < " . $fldata : " < '" . $fldata . "'";
                    break;
                case "le":
                    $wh .= (is_numeric($fldata)) ? " <= " . $fldata : " <= '" . $fldata . "'";
                    break;
                case "gt":
                    $wh .= (is_numeric($fldata)) ? $wh .= " > " . $fldata : " > '" . $fldata . "'";
                    break;
                case "ge":
                    $wh .= (is_numeric($fldata)) ? " >= " . $fldata : " >= '" . $fldata . "'";
                    break;
                case "ew":
                    $wh .= " LIKE '%" . $fldata . "'";
                    break;
                default :
                    $wh .= " LIKE '%" . $fldata . "%'";
                    break;
            }
        }

        $start = $limit * $page - $limit;
        if ($start < 0)
            $start = 0;

        $strquery = $SQL . $wh . " ORDER BY " . $sidx . " " . $sord . " LIMIT " . $start . " , " . $limit;
        $strquery = preg_replace("/(select|SELECT)/", "SELECT SQL_CALC_FOUND_ROWS ", $strquery);
        $result = mysql_query($strquery, $cnn);
        
        $result_count = mysql_query("SELECT FOUND_ROWS()", $cnn);
        $count = mysql_fetch_row($result_count);
        $count = $count[0];
        $total_pages = ($count > 0) ? ceil($count / $limit) : 0;

//        echo $strquery;
//        die;
        
        $responce->page = $page;
        $responce->total = $total_pages;
        $responce->records = $count;

        $i = 0;
        while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) {
            $data = array();
            $j = 0;

            foreach ($row as $k => $v) {
                if ($k == $campoId)
                    $responce->rows[$i]['id'] = $v;
                if ($utf8 == true)
                    $v = utf8_encode($v);

                $data[$j] = $v;
                $j++;
            }

            $responce->rows[$i]['cell'] = $data;
            $i++;
        }

        echo $json->encode($responce);
    }

    public function strip($value) {
        if (get_magic_quotes_gpc() != 0) {
            if (is_array($value))
                if ($this->arrayIsAssociative($value)) {
                    foreach ($value as $k => $v)
                        $tmp_val[$k] = stripslashes($v);
                    $value = $tmp_val;
                }
                else
                    for ($j = 0; $j < sizeof($value); $j++)
                        $value[$j] = stripslashes($value[$j]);
            else
                $value = stripslashes($value);
        }

        return $value;
    }

    public function arrayIsAssociative($array) {
        if (is_array($array) && !empty($array)) {
            for ($iterator = count($array) - 1; $iterator; $iterator--) {
                if (!array_key_exists($iterator, $array)) {
                    return true;
                }
            }
            return !array_key_exists(0, $array);
        }
        return false;
    }

    /**
     * @Descripcion Funcion que Evalua la Extension de un Archivo.
     * @Retorna String [retorna la extencion del archivo];
     * */
    public function extension($archivo) {
        // Devuelve true si es Verdadero y false si es Falso
        $len_file = strlen($archivo);
        $len_ext = 3;
        $ext = substr($archivo, $len_file - $len_ext, $len_file);
        $file = strtolower($ext);
        return $file;
    }

    /**
     * @Descripcion Crea una nueva imagen a partir de un tipo de imagen especifico.
     * @Retorna Resouce [retorna un objeto del tipo imagen para ser manipulado];
     * */
    public function creaImagen($path_image, $name) {
        switch ($this->extension($name)) {
            case "jpg":
                $imagen = imagecreatefromjpeg($path_image);

                break;

            case "png":
                $imagen = imagecreatefrompng($path_image);
                break;

            default:
                $imagen = imagecreatefromgif($path_image);
                break;
        }

        return $imagen;
    }

    function saveImagen($imgResouce, $savePath, $quality = 75, $TNMaxX = 128, $TNMaxY = 86) {
        // determina el tamanio de la imagen
        $imx = @ImageSX($imgResouce);
        $imy = @ImageSY($imgResouce);

        //determina proporcion en unidades
        $x = $imx / $TNMaxX;
        $y = $imy / $TNMaxY;

        // calcula la escala
        if ($x > $y)
            $scale = $TNMaxX / $imx;
        if ($x < $y)
            $scale = $TNMaxY / $imy;
        if ($x == $y)
            $scale = $TNMaxY / $imy;

        //Escala la imagen
        $x = intval($imx * $scale);
        $y = intval($imy * $scale);

        //crea la imagen escalada
        $newImg = @ImageCreateTrueColor($x, $y);
        @imagecopyresized($newImg, $imgResouce, 0, 0, 0, 0, $x, $y, $imx, $imy);

        return @imagejpeg($newImg, $savePath, 100);
    }

    /**
     * JLTools::ResizeImage()
     * Redimensiona proporcionalmente una imágen GIF, JPG o PNG
     * @param string $nombre
     * @param string $savePath
     * @param int $anchura
     * @param int $hmax
     * @param int $quality
     * @return bool
     */
    function resizeImage($nombre, $savePath, $anchura = 180, $hmax = 180, $quality = 75) {

        $datos = getimagesize($nombre);

        if ($datos[2] == 1) {
            $img = @imagecreatefromgif($nombre);
        }
        if ($datos[2] == 2) {
            $img = @imagecreatefromjpeg($nombre);
        }
        if ($datos[2] == 3) {
            $img = @imagecreatefrompng($nombre);
        }

        $ratio = ($datos[0] / $anchura);
        $altura = ($datos[1] / $ratio);

        if ($altura > $hmax) {
            $anchura2 = $hmax * $anchura / $altura;
            $altura = $hmax;
            $anchura = $anchura2;
        }

        $thumb = @imagecreatetruecolor($anchura, $altura);
        imagecopyresampled($thumb, $img, 0, 0, 0, 0, $anchura, $altura, $datos[0], $datos[1]);

        if ($datos[2] == 1) {
            // header("Content-type: image/gif"); 
            $bool = imagegif($thumb, $savePath);
        }
        if ($datos[2] == 2) {
            // header("Content-type: image/jpeg");
            $bool = imagejpeg($thumb, $savePath, $quality);
        }
        if ($datos[2] == 3) {
            // header("Content-type: image/png"); 
            $bool = imagepng($thumb, $savePath, $quality);
        }

        imagedestroy($thumb);

        return $bool;
    }

    /**
     * JLTools::sizeImage()
     * Obtiene las dimensiones de una imagen GIF, JPG o PNG.
     * Los índices 0 y 1 contienen respectivamente el ancho y la altura de la imagen.
     * @param string $nombre
     * @return array
     */
    function sizeImage($nombre) {
        $datos = getimagesize($nombre);

        if ($datos[2] == 1) {
            $img = @imagecreatefromgif($nombre);
        }
        if ($datos[2] == 2) {
            $img = @imagecreatefromjpeg($nombre);
        }
        if ($datos[2] == 3) {
            $img = @imagecreatefrompng($nombre);
        }

        $_data[] = $datos[0];
        $_data[] = $datos[1];

        return $_data;
    }

    /**
     * replaceCaracteresAcentuados()
     * Reemplaza solo Caracteres acentuados.
     * @param string $text
     * @param bool $rempace
     * @return
     */
    function replaceCaracteresAcentuados($text, $rempace = true) {
        $search = array('Ž', 'š', 'Ÿ', 'À', 'Á', 'Â', 'Ã', 'Ä', 'Å', 'Ç', 'È', 'É', 'Ê', 'Ë', 'Ì', 'Í', 'Î', 'Ï', 'Ñ', 'Ò', 'Ó', 'Ô', 'Õ', 'Ö', 'Ù', 'Ú', 'Û', 'Ü', 'Ý', 'à', 'á', 'â', 'ã', 'ä', 'å', 'ç', 'è', 'é', 'ê', 'ë', 'ì', 'í', 'î', 'ï', 'ñ', 'ò', 'ó', 'ô', 'õ', 'ö', 'ù', 'ú', 'û', 'ü', 'ý', 'ÿ', 'Š', 'š', 'Ÿ');
        $rsearch = array('Z', 's', 'Y', 'A', 'A', 'A', 'A', 'A', 'A', 'C', 'E', 'E', 'E', 'E', 'I', 'I', 'I', 'I', 'N', 'O', 'O', 'O', 'O', 'O', 'U', 'U', 'U', 'U', 'Y', 'a', 'a', 'a', 'a', 'a', 'a', 'c', 'e', 'e', 'e', 'e', 'i', 'i', 'i', 'i', 'n', 'o', 'o', 'o', 'o', 'o', 'u', 'u', 'u', 'u', 'y', 'y', 'S', 's', 'Y');

        return str_replace($search, $rsearch, $text);
    }

    /**
     * HTMLTranslate()
     * Codifica o decodifica caracteres a HTML.
     * @param string $string
     * @param bool $encode
     * @return string
     */
    function HTMLTranslate($text, $encode = true) {
        if ($encode) {
            $table = get_html_translation_table(HTML_ENTITIES);
            $codificado = strtr($text, $table);
        } else {
            $codificado = html_entity_decode($text);
            $caract = array("&lsquo;", "&rsquo;", "&sbquo;", "&ldquo;", "&rdquo;", "&bdquo;");
            $newcaract = array("‘", "’", "‚", "“", "”", "„");
            $codificado = str_replace($caract, $newcaract, $codificado);
        }

        return $codificado;
    }

    /**
     * removeSpecialCaracter()
     * Reemplaza caracteres especiales de una cadena.
     * @param string $text
     * @param string $replace
     * @return string
     */
    function removeSpecialCaracter($text, $replace = "") {
        $search = array('!', '"', '#', '$', '%', '&', "'", '(', ')', '*', '+', ',', '-', '.', '/', ':', ';', '<', '=', '>', '?', '@', '[', '\ ', ']', '^', '_', '`', '{', '|', '}', '~', '', '€', '', '‚', 'Œ', '', 'Ž', '', '', '‘', '’', '“', '”', '•', '–', '—', '˜', '™', 'š', '›', 'œ', '', '', 'Ÿ', ' ', '¡', '¢', '£', '¤', '¥', '¦', '§', '¨', '©', 'ª', '«', '¬', '­', '®', '¯', '°', '±', '²', '³', '´', 'µ', '¶', '·', '¸', '¹', 'º', '»', '¼', '½', '¾', '¿', 'À', 'Á', 'Â', 'Ã', 'Ä', 'Å', 'Æ', 'Ç', 'È', 'É', 'Ê', 'Ë', 'Ì', 'Í', 'Î', 'Ï', 'Ð', 'Ñ', 'Ò', 'Ó', 'Ô', 'Õ', 'Ö', '×', 'Ø', 'Ù', 'Ú', 'Û', 'Ü', 'Ý', 'Þ', 'ß', 'à', 'á', 'â', 'ã', 'ä', 'å', 'æ', 'ç', 'è', 'é', 'ê', 'ë', 'ì', 'í', 'î', 'ï', 'ð', 'ñ', 'ò', 'ó', 'ô', 'õ', 'ö', '÷', 'ø', 'ù', 'ú', 'û', 'ü', 'ý', 'þ', 'ÿ', 'Œ', 'œ', 'Š', 'š', 'Ÿ', 'ˆ', '˜', '?', '?', '?', '?', '–', '—', '‘', '’', '‚', '“', '”', '„', '†', '‡', '‰', '‹', '›', '?', '?', '’', '…');
        $text = str_replace($search, $replace, $text);
        return $text;
    }

    public function shorterString($string, $max_len = 400, $clean_tags_html = TRUE, $is_dots = TRUE, $dots = '...') {
        $xdots = '';

        if (trim($string) != '') {
            if ($is_dots && strlen($string) > $max_len) {
                $xdots = $dots;
            }
            if ($clean_tags_html) {
                $string = $this->cleanHTMLTags($string);
            }
            $string .= ' ';
            $string = substr($string, 0, $max_len + 1);
            $string = substr($string, 0, strrpos($string, ' '));
        }

        return $string . $xdots;
    }

    public function cleanHTMLTags($string) {
        return (trim($string) != '') ? preg_replace('/<[^>]*>/', '', $string) : $string;
    }

    function cleanSomeHTMLTags($html, $permitted_style = FALSE, $remove = FALSE) {
        $tags = "html|body|head|thead|style|script|ul|li|sup|ol|table|td|th|tr|tbody|sup|object|input|button|form|noscript|img|hr|h([0-9])|blockquote|pre";
        $html = preg_replace("/(<!--(.*)-->|<($tags)>(.*)<\/($tags)>)/Uis", '', $html);
        $html = preg_replace("/[\s](class|id)\=\"(.+)\"/Uis", '', $html);

        if (!$permitted_style) {
            $html = preg_replace("/[\s](style)\=\"(.+)\"/Uis", '', $html);
        }

        $html = preg_replace("/<(\/)?(div|dt|dd|dl)[^>]*>/", '', $html);

        if ($permitted_style && $remove) {
            $html = preg_replace("/[\s]style\=\"" . $permitted_style . "\"/Uis", '', $html);
        }
        return trim($html);
    }

    function cleanTextEditor($string) {
        return $this->cleanSomeHTMLTags($string, '(color:(.*)|background:(.*)|font-size:(.*)|font-family:(.*))', TRUE);
    }

    private function removeAccent($str) {
        $a = array('À', 'Á', 'Â', 'Ã', 'Ä', 'Å', 'Æ', 'Ç', 'È', 'É', 'Ê', 'Ë', 'Ì', 'Í', 'Î', 'Ï',
            'Ð', 'Ñ', 'Ò', 'Ó', 'Ô', 'Õ', 'Ö', 'Ø', 'Ù', 'Ú', 'Û', 'Ü', 'Ý', 'ß', 'à', 'á', 'â', 'ã',
            'ä', 'å', 'æ', 'ç', 'è', 'é', 'ê', 'ë', 'ì', 'í', 'î', 'ï', 'ñ', 'ò', 'ó', 'ô', 'õ', 'ö',
            'ø', 'ù', 'ú', 'û', 'ü', 'ý', 'ÿ', 'A', 'a', 'A', 'a', 'A', 'a', 'C', 'c', 'C', 'c', 'C',
            'c', 'C', 'c', 'D', 'd', 'Ð', 'd', 'E', 'e', 'E', 'e', 'E', 'e', 'E', 'e', 'E', 'e', 'G',
            'g', 'G', 'g', 'G', 'g', 'G', 'g', 'H', 'h', 'H', 'h', 'I', 'i', 'I', 'i', 'I', 'i', 'I',
            'i', 'I', 'i', '?', '?', 'J', 'j', 'K', 'k', 'L', 'l', 'L', 'l', 'L', 'l', '?', '?', 'L',
            'l', 'N', 'n', 'N', 'n', 'N', 'n', '?', 'O', 'o', 'O', 'o', 'O', 'o', 'Œ', 'œ', 'R', 'r',
            'R', 'r', 'R', 'r', 'S', 's', 'S', 's', 'S', 's', 'Š', 'š', 'T', 't', 'T', 't', 'T', 't',
            'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'W', 'w', 'Y', 'y', 'Ÿ', 'Z',
            'z', 'Z', 'z', 'Ž', 'ž', '?', 'ƒ', 'O', 'o', 'U', 'u', 'A', 'a', 'I', 'i', 'O', 'o', 'U',
            'u', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', '?', '?', '?', '?', '?', '?');
        $b = array('A', 'A', 'A', 'A', 'A', 'A', 'AE', 'C', 'E', 'E', 'E', 'E', 'I', 'I', 'I', 'I',
            'D', 'N', 'O', 'O', 'O', 'O', 'O', 'O', 'U', 'U', 'U', 'U', 'Y', 's', 'a', 'a', 'a', 'a',
            'a', 'a', 'ae', 'c', 'e', 'e', 'e', 'e', 'i', 'i', 'i', 'i', 'n', 'o', 'o', 'o', 'o', 'o',
            'o', 'u', 'u', 'u', 'u', 'y', 'y', 'A', 'a', 'A', 'a', 'A', 'a', 'C', 'c', 'C', 'c', 'C',
            'c', 'C', 'c', 'D', 'd', 'D', 'd', 'E', 'e', 'E', 'e', 'E', 'e', 'E', 'e', 'E', 'e', 'G',
            'g', 'G', 'g', 'G', 'g', 'G', 'g', 'H', 'h', 'H', 'h', 'I', 'i', 'I', 'i', 'I', 'i', 'I',
            'i', 'I', 'i', 'IJ', 'ij', 'J', 'j', 'K', 'k', 'L', 'l', 'L', 'l', 'L', 'l', 'L', 'l', 'l',
            'l', 'N', 'n', 'N', 'n', 'N', 'n', 'n', 'O', 'o', 'O', 'o', 'O', 'o', 'OE', 'oe', 'R', 'r',
            'R', 'r', 'R', 'r', 'S', 's', 'S', 's', 'S', 's', 'S', 's', 'T', 't', 'T', 't', 'T', 't',
            'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'W', 'w', 'Y', 'y', 'Y', 'Z',
            'z', 'Z', 'z', 'Z', 'z', 's', 'f', 'O', 'o', 'U', 'u', 'A', 'a', 'I', 'i', 'O', 'o', 'U',
            'u', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'A', 'a', 'AE', 'ae', 'O', 'o');
        return str_replace($a, $b, $str);
    }

    /**
     * JLTools::replaceAccentCharacters()
     * Change accented string characters to equivalent string no accented.
     * @param string $string
     * @param string $spaceReplace
     * @return string
     */
    function replaceAccentCharacters($string, $spaceReplace = '-') {
        return strtolower(preg_replace(array('/[^a-zA-Z0-9 ' . $spaceReplace . ']/',
                            '/[ ' . $spaceReplace . ']+/', '/^' . $spaceReplace . '|' . $spaceReplace . '$/'), array('', $spaceReplace, ''), $this->removeAccent(html_entity_decode($string))));
    }

}